Skip to content

Latest commit

 

History

History
299 lines (196 loc) · 10.9 KB

11.Menus - loading and restartig the game.md

File metadata and controls

299 lines (196 loc) · 10.9 KB

< 前一篇 后一篇 >

菜单-加载画面和重新开始

我们已经完成了第一个关卡,包括基本玩法,一些声音,图像和粒子。

然而,当player死掉后,游戏仍然在进行,并不能重新开始。此外,当你加载它的时候,游戏会直接开始,我们非常清楚,在哪里我们需要使用菜单来控制游戏。

Damien:直接的讲:菜单和GUI在游戏并没有乐趣,你通常可以用一个非常基础的GUI框架(没有也行)。

你会花不少时间,但结果是…玩家会非常快的跳过菜单

Matthieu:不同于很多游戏开发者,我并不同意上面的观点,创建一个的游戏GUI不是一件简单事情,但它是有好处且有趣的。然后,创建菜单需要好的工具和一些实用的设计(就像应用界面)

但是,怎么说呢:一个好的菜单很可能是不可见的,因为玩家可能根本没有注意到它就退出了。

从Unity 4.6开始,UI tools已经升级了,现在可以制作一些非常时髦的菜单。

在本教程里,我们不会制作一个复杂的GUI,但我们会做个基础的。

素材

背景

background

(右键单击保存图片)

LOGO

logo

(右键单击保存图片)

导入这些素材到项目里,你可以把它们放到"sprites"里的"Menu"下。否则"background"将会把之前的文件覆盖掉。

至于按钮,我们将使用标准库里的。

标题界面

几乎所有的游戏都有标题界面,这是玩家在开始游戏前呆的地方。

Damien:一些是令人惊叹和值得留念的:Megaman(洛克人), Metal Slug(合金弹头)… (我是一个标题屏幕的粉丝)

我们将制作的可能没有样的令人惊叹,但是...简单!

场景

首先,创建一个新的场景:

  1. "File" -> "New scene".
  2. 保存它到"Scenes"目录里,并命名为"Menu".

小巧门:你也可以使用cmd + N(OS X) 或者 ctrl + N (Windows) 快捷键

我们的标题界面由以下内容组成:

  • 一个背景图片
  • 一个LOGO
  • 一个脚本来显示按钮

让我们来制作背景,使用专用菜单"Game Object" -> "UI" -> "Image",Unity会创建所有需要的对象和组件。

Create UI image

  1. 将新建的UI对象,命名为"Background"
  2. 将anchor设置为 horizontally & vertically

Set anchors

  1. 确保"Top", "Botton", "Left"和"Right"的值为0

你应该有了一个全屏的背景,不要担心你使用的分辨率。

Set background image

(上图为16:9,如果你的效果和它不同,将Game预览里的画面比例置为16:9即可)

现在,同背景一样,添加logo:

  1. 设置它的大小为512 * 512
  2. 勾上"Preserve Aspect"
  3. 设置anchor为"middle & center (居中)"

Set logo image

当然,你可以添加你的名字,介绍,笑话或动画。菜单是自由的,只是要考虑到,玩家想尽快的开始游戏。

加载脚本

现在,我们将添加按钮,并使用脚本来开始游戏。

使用菜单创建一个新按钮("Game Object -> UI -> Button")。将它放到标题界面上,试着改变按钮文本!:)

就是下面这样:

Start button

在"Scripts"目录下创建"MenuScript"脚本,将它添加到一个新的游戏空对象里(像之前一样,叫"Scripts")

using UnityEngine;

/// <summary>
/// Title screen script
/// </summary>
public class MenuScript : MonoBehaviour
{
    public void StartGame()
    {
        // "Stage1" is the name of the first scene we created.
        Application.LoadLevel("Stage1");
    }
}

译者注:在Unity 2018.3里,Application.LoadLevel(string);方法已过时,建议使用SceneManager.LoadScene(string);方法,但要使用SceneManager,需要先导入UnityEngine.SceneManager包,所以新的脚本是

using UnityEngine;
using UnityEngine.SceneManagement;

public class MenuScript : MonoBehaviour
{
    public void StartGame()
    {
        // Application.LoadLevel("Stage1");
        SceneManager.LoadScene("Stage1");
    }
}

最后一步:我们为按钮写个脚本。

在你按钮的"OnClick()"列表里

  1. 使用"+"按钮增加一个新的监听
  2. 拖动"Scripts"对象到这个新加行上
  3. 将调用方法设置为MenuScript.StartGame()

Button Wire

然后,运行游戏,看看你的漂亮菜单吧:

Button result

点击Play!...崩溃!

译者注:在Unity 2018.3里这里并没有崩溃。所以,下面关于这个崩溃的处理,只需了解一下

Level 'Stage1' (-1) couldn't be loaded because it has not been added to the build settings. To add a level to the build settings use the menu File->Build Settings...

我们要做什么,错误信息里已经写清楚了。

添加场景到BUILD里

打开"File" -> "Build Settings":

Build settings

把需要的场景都添加进去,我们这里是:"Menu"和"Stage1"

Adding scenes

回到菜单界面,点击Play!

Start game

小巧门:SceneManager.LoadScene()方法的作用是在当前的场景里实例化另一个场景里的所有对象。有时,你想从第一个场景保留一个游戏对象到下一个场景 (举个例子,在两个菜单点不间断的音乐),Unity为这个提供了DontDestroyOnLoad(aGameObject)方法,用它调用一个游戏对象,那么这个游戏对象将不会在新场景被加载时销毁。事实上,它将不会再被任何场景销毁。所以,如果你想删除它,你需要手动处理。

死亡和重新开始

通常,我们将允许玩家一旦死亡后,可以重新开始游戏。正如你看到的,它经常发生 (我们将在即将到来的章节,让游戏更简单点)

我们的游戏将像下面这样:

  1. 玩家被子弹打中
  2. 调用HealthScript.OnCollisionEnter
  3. 玩家失败1点生命值
  4. HealthScript将在玩家生命值少于1的时候摧毁他

我们将增加两步:

  1. 调用PlayerScript.OnDestroy
  2. 创建一个"GameOverScript"并添加到场景中

在"Scripts"目录里添加"GameOverScript"。

它将只有一点代码,包含"Restart"和"Back to Menu"按钮:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManager;

/// <summary>
/// Start or quit the game
/// </summary>
public class GameOverScript : MonoBehaviour
{
    private Button[] buttons;

    void Awake()
    {
        // Get the buttons
        buttons = GetComponentsInChildren<Button>();

        // Disable them
        HideButtons();
    }

    public void HideButtons()
    {
        foreach (var b in buttons)
        {
            b.gameObject.SetActive(false);
        }
    }

    public void ShowButtons()
    {
        foreach (var b in buttons)
        {
            b.gameObject.SetActive(true);
        }
    }

    public void ExitToMenu()
    {
        // Reload the level
        // Application.LoadLevel("Menu");
        SceneManager.LoadScene("Menu");
    }

    public void RestartGame()
    {
        // Reload the level
        // Application.LoadLevel("Stage1");
        SceneManager.LoadScene("Stage1");
    }
}

我们同样需要一些UI组件。

  1. 在"Stage1"场景,创建一个"Panel"
  2. 移除"Source Image",将颜色设置为是白色且全透明
  3. 添加两个按钮到panel里
  4. 添加"GameOverScript"到panel里

Game Over UI

为每个按钮:

  1. 添加"OnClick()"事件,将Panel拖到事件里
  2. 在"GameOverScript"里选择适用的方法

举个例子,"Back to menu"按钮:

Menu OnClick

接下来,在"PlayerScript"里,我们必须在死亡时调用这个脚本:

void OnDestroy()
{
    // Game Over.
    var gameOver = FindObjectOfType<GameOverScript>();
    gameOver.ShowButtons();
}

运行游戏,试着去死 (应该要不了多久):

Game Over

当然,它可以添加点分数和动画,加强一下效果,举个例子。

咯,并没有!:)

下一步

我们刚刚学习了如果在游戏里添加菜单。

看看到现在,你都完成了什么:

  • 一个使用3张背景层的视差滚动
  • 一些粒子
  • 标题界面
  • 图像和声音
  • 一个shmup 横版卷轴射击游戏,一个玩家,多个敌人

恭喜啊!但,不幸的是,它只是在你的电脑上,要销售这款获奖游戏,我们需要发布它。

这就是我们将在最后一章要讲的东西:发布。

< 前一篇 后一篇 >